"""
对字典进行处理的模块
"""

def expand_dicts(value,key=''):
    """
    函数作用：将嵌套的字典展开，扁平化
    返回：展开后的字典
    用途：在获取每一个网站的每个solution的url时，总会在提取下一级solution时形成字典的嵌套
    这种嵌套并没有什么用，所以需要将嵌套展平
    """
    catList = {}
    _expand_dicts(value,key=key,catList=catList)
    return catList

def _expand_dicts(value,key='',catList=None):
    """
    函数作用：将嵌套的字典展开，扁平化
            实现expand_dicts函数的内部驱动
    例如：将{'foo1':{'bar1':1},'foo2':{'bar2':2}}
        展开为{'foo1 -> bar1':1,'foo2 -> bar2':2}
    参数:
        value:传入要展开的字典
        key:传入要给每一个key要加上的一段字符串,默认为空字符串
        catList:传入一个字典作为获取结果的中间值,
                不建议用，默认空字典就很好
    """
    if catList is None:
        catList = {}
    if type(value) == type({}):
        for subkey,subvalue in value.items():
            if key:    
                subkey = key + ' -> ' + subkey
            _expand_dicts(subvalue,subkey,catList)
    else:
        catList.update({key:value})


def expand_dicts_old(value,key='',catList={}):
    """
    函数作用：将嵌套的字典展开，扁平化
    例如：将{'foo1':{'bar1':1},'foo2':{'bar2':2}}
        展开为{'foo1 -> bar1':1,'foo2 -> bar2':2}
    参数:
        value:传入要展开的字典
        key:传入要给每一个key要加上的一段字符串,默认为空字符串
        catList:传入一个字典作为获取结果的中间值,
                不建议用，默认空字典就很好
    """
    if type(value) == type({}):
        for subkey,subvalue in value.items():
            if key:    
                subkey = key + ' -> ' + subkey
            catList.update(expand_dicts_old(subvalue,subkey,catList))
        return catList
    else:
        catList.update({key:value})
        return catList

## 为啥将catList带入列表会使返回列表变大的越来越离谱直到超内存？
## 回答：
'''     这是因为python的赋值机制和拷贝机制，
        是将变量名赋给一块内存,
        而不是给新变量重新开辟一块内存，再把值复制到内存中。
        函数传参也是一样，在函数中传入的实参如果在函数内被改变，
        则在函数外也会变化。这就是为什么在执行时返回的列表会越来
        越大，越来越离谱的原因。
        解决方法也很简单，如下代码，直接将实参传入catList，处理后
        接着使用实参即可。
'''
'''def expand_dicts(value,key='',catList=[]):
    if type(value) == type({}):
        for subkey,subvalue in value.items():
            if key:    
                subkey = key + ' -> ' + subkey
            expand_dicts(subvalue,subkey,catList)
    else:
        catList.append({key:value})

    a = []
    expand_dicts(value,catList=a) ##这样处理后，发现a变化了   
        '''



def format_info(data):
    """
    爬虫爬下来的数据总有一些不符合格式的地方，
    比如数据或者key的前后空白符，比如处理key的“.”
    符号以防止嵌套。所以需要在保存之前预先进行处理。

    函数作用：在将数据保存入mongo之前将字典的格式整理好，
            对键的处理：将字典的键中的“.”替换为“`”
            对值的处理：去掉值前后的空白
    函数参数：
        data ：数据字典
    函数返回：
        处理后的字典
    """
    newData = {}

    for key,value in data.items():
        if type(value) != str:
            newData[key] = value
            continue
        key = key.replace('.','`').strip()
        if not value:
            newData[key] = value.replace("\n","。")
            continue
        newData[key] = value.strip()
    
    return newData